The analysis below is for Baltimore homeownership incentive programs including:

Weatherization and repairs will be added once geocoding is completed.

The primary research questions are:

Loading required package: sp

Homeownership

All Homeownership Incentive Distributions, 2016-2018

Each incentive distribution was geocoded to repair/replace neighborhood assignment and to provide point locations for any later clustering or hot spot analysis.

Funding distribution by HMT group

The summary table below gives the percent of program funding that was distributed to each housing market type. Live Near Your Work is utilized primarily in strong/healhty markets, while 85% of CDBG funding goes to middle neighborhoods.

incen %>% 
  group_by(prog.type, hmt.group) %>%
  summarise(total = sum(as.numeric(amount))) %>%
  mutate(total = ifelse(is.na(total), 0, total)) %>%
  filter(!is.na(prog.type)) %>%
  ungroup() %>%
  group_by(prog.type) %>%
  mutate(pct = percent(total / sum(total))) %>%
  select(-total) %>%
  spread(key = prog.type, value = pct)

The map and table below present a program “utilization” metric - the number of incentives used per 100 home sales.

The summary table below gives program “utilization” by housing market typology tier.

Program demographics

Effect of Programs

Error: `by` required, because the data sources have no common variables
Call `rlang::last_error()` to see a backtrace

Weatherization + Repair

[needs geocoded]

LS0tDQp0aXRsZTogIkhvbWVidXlpbmcgSW5jZW50aXZlIFByb2dyYW1zIg0Kc3VidGl0bGU6ICJEZXBhcnRtZW50IG9mIEhvdXNpbmcgYW5kIENvbW11bml0eSBEZXZlbG9wbWVudCwgQ2l0eSBvZiBCYWx0aW1vcmUiDQphdXRob3I6ICJKdXN0aW4gRWxzemFzeiwgTWF5b3IncyBPZmZpY2Ugb2YgSW5ub3ZhdGlvbiINCmVtYWlsOiAianVzdGluLmVsc3phc3pAYmFsdGltb3JlY2l0eS5nb3YiDQpkYXRlOiAiTW9uZGF5LCBNYXJjaCAyNSwgMjAxOSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBmaWdfaGVpZ2h0OiA1DQogICAgZmlnX3dpZHRoOiAxMA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAyDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpUaGUgYW5hbHlzaXMgYmVsb3cgaXMgZm9yIEJhbHRpbW9yZSBob21lb3duZXJzaGlwIGluY2VudGl2ZSBwcm9ncmFtcyBpbmNsdWRpbmc6DQogDQotIENvbW11bml0eSBEZXZlbG9wbWVudCBCbG9jayBHcmFudHMNCi0gTGl2ZSBOZWFyIFlvdXIgV29yaw0KLSBWYWNhbnRzIHRvIFZhbHVlDQoNCldlYXRoZXJpemF0aW9uIGFuZCByZXBhaXJzIHdpbGwgYmUgYWRkZWQgb25jZSBnZW9jb2RpbmcgaXMgY29tcGxldGVkLg0KDQpUaGUgcHJpbWFyeSByZXNlYXJjaCBxdWVzdGlvbnMgYXJlOg0KDQotIFdoZXJlIGFyZSBlYWNoIG9mIHRoZSBwcm9ncmFtcyB1dGlsaXplZCBhbmQgYXJlIHRoZXJlIGNvbmNlbnRyYXRpb25zPw0KLSBXaGF0IHByb2dyYW1zIGFyZSBzZXJ2aW5nIHN0cm9uZywgbWlkZGxlLCBhbmQgZGlzdHJlc3NlZCBuZWlnaGJvcmhvb2RzLCByZXNwZWN0aXZlbHk/DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjYWNoZSA9IFRSVUV9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRiwgbWVzc2FnZSA9IEYsIGluY2x1ZGUgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA1KQ0KDQpvcHRpb25zKHNjaXBlbiA9IDk5OSkNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGdnbWFwKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShodG1sdG9vbHMpDQpsaWJyYXJ5KFJTb2NyYXRhKQ0KbGlicmFyeShzaGlueSkNCnNvdXJjZSgiLi4vc3JjLzAwX2luaXRpYWxpemUuUiIpDQpgYGANCg0KYGBge3IgbG9hZC5kYXRhLCBjYWNoZSA9IFQsIHdhcm5pbmcgPSBGLCBlY2hvID0gRiwgbWVzc2FnZSA9IEZ9DQppbmNlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9wcm9jZXNzZWQvaG9tZWJ1eWluZ19pbmNlbnRpdmVzL2hvbWVidXlpbmdfaW5jZW50aXZlX3Byb2dyYW1zLmNzdiIsIG5hID0gYygiTkEiKSkNCg0KI2hvb2RzIDwtIGdldF9uZWlnaGJvcmhvb2RfYm91bmRhcmllcygpDQpob29kcyA8LSByZWFkUkRTKCIuLi9kYXRhL3Byb2Nlc3NlZC9ob29kcy5SZHMiKQ0KaG10LmJ5Lmhvb2QgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9yYXcvaG10L0hNVCBieSBOZWlnaGJvcmhvb2QgMjAxNy54bHN4IikgJT4lDQogIHRyYW5zbXV0ZShuZWlnaGJvcmhvb2QgPSBOZWlnaGJvcmhvb2QsDQogICAgICAgICAgICBwcmVkb21pbmFudC5jb2RlID0gYFByZWRvbWluYW50IENvZGUgSWdub3JpbmcgTm9uLVJlc2lkZW50aWFsYCkNCnNhbGVzIDwtIGxvYWRfc2FsZXNfZGF0YShsb2FkLmNhY2hlID0gVCkNCg0KI3JlYWwucHJvcC51cmwgPC0gImh0dHBzOi8vZGF0YS5iYWx0aW1vcmVjaXR5Lmdvdi9yZXNvdXJjZS82YWN0LXF6dXkuanNvbiINCiNyZWFsLnByb3AgPC0gcmVhZC5zb2NyYXRhKHJlYWwucHJvcC51cmwsIGFwcF90b2tlbiA9IFZBUlMkU09DUkFUQV9UT0tFTikNCnJlYWwucHJvcCA8LSByZWFkX3JkcygiLi4vZGF0YS9wcm9jZXNzZWQvcmVhbF9wcm9wLlJkcyIpDQoNCmBgYA0KDQpgYGB7cn0NCmhvb2RzQGRhdGEgPC0gaG9vZHNAZGF0YSAlPiUgbGVmdF9qb2luKGhtdC5ieS5ob29kLCBieSA9IGMoImxhYmVsIiA9ICJuZWlnaGJvcmhvb2QiKSkNCmBgYA0KDQpgYGB7cn0NCmhtdC5sZXZlbHMgPC0gYygiaGVhbHRoeSIsICJ1cHBlciBtaWRkbGUiLCAibG93ZXIgbWlkZGxlIiwgImRpc3RyZXNzZWQiLCAib3RoZXIiKQ0KDQppbmNlbiA8LSBpbmNlbiAlPiUgDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKHByb2cudHlwZSwgaG10Lmdyb3VwLCBwcmVkb21pbmFudC5jb2RlLCBsYWJlbCwgZ2VuZGVyLCByYWNlLCBldGhuaWNpdHkpLA0KICAgIGZ1bnMoYXMuZmFjdG9yKQ0KICApICU+JQ0KICBtdXRhdGUoaG10Lmdyb3VwID0gZmN0X3JlbGV2ZWwoaG10Lmdyb3VwLCBobXQubGV2ZWxzKSkNCg0KYGBgDQoNCmBgYHtyfQ0Kc2FsZXMgPC0gc2FsZXMgJT4lIHJlbmFtZShzYWxlcy5ibG9jayA9IEJsb2NrLCBzYWxlcy5sb3QgPSBMb3QpDQpyZWFsLnByb3AgPC0gcmVhbC5wcm9wICU+JSByZW5hbWUocmVhbC5ibG9jayA9IGJsb2NrLCByZWFsLmxvdCA9IGxvdCkNCmBgYA0KDQpgYGB7cn0NCnJlYWwucHJvcCA8LSByZWFsLnByb3AgJT4lDQogIG11dGF0ZShyZWFsLmJsb2NrLmNsZWFuID0gZ3N1YigiXjArIiwgIiIsIHJlYWwuYmxvY2spLA0KICAgICAgICAgcmVhbC5sb3QuY2xlYW4gPSBnc3ViKCJeMCsiLCAiIiwgcmVhbC5sb3QpKQ0KDQpzYWxlcyA8LSBzYWxlcyAlPiUNCiAgbXV0YXRlKHNhbGVzLmJsb2NrLmNsZWFuID0gZ3N1YigiXjArIiwgIiIsIHNhbGVzLmJsb2NrKSwNCiAgICAgICAgIHNhbGVzLmxvdC5jbGVhbiA9IGdzdWIoIl4wKyIsICIiLCBzYWxlcy5sb3QpKSANCmBgYA0KDQpgYGB7cn0NCiMgZmlsdGVyIGZvciBwcmluY2lwYWwgcmVzaWRlbmNlIGFuZCAibm9ybWFsIiBwdXJjaGFzZXMNCnNhbGVzIDwtIHNhbGVzICU+JQ0KICBsZWZ0X2pvaW4ocmVhbC5wcm9wLCANCiAgICAgICAgICAgIGJ5ID0gYygic2FsZXMuYmxvY2suY2xlYW4iID0gInJlYWwuYmxvY2suY2xlYW4iLA0KICAgICAgICAgICAgICAgICAgICJzYWxlcy5sb3QuY2xlYW4iID0gInJlYWwubG90LmNsZWFuIikNCiAgICAgICAgICAgICkgJT4lDQogIGZpbHRlcihgSG93IENvbnZleWVkYCA9PSAxLA0KICAgICAgICAgIWdyZXBsKCJOT1QiLCByZXNjb2RlKSkNCmBgYA0KDQoNCiMgSG9tZW93bmVyc2hpcA0KDQojIyMgQWxsIEhvbWVvd25lcnNoaXAgSW5jZW50aXZlIERpc3RyaWJ1dGlvbnMsIDIwMTYtMjAxOA0KDQpFYWNoIGluY2VudGl2ZSBkaXN0cmlidXRpb24gd2FzIGdlb2NvZGVkIHRvIHJlcGFpci9yZXBsYWNlIG5laWdoYm9yaG9vZCBhc3NpZ25tZW50IGFuZCB0byBwcm92aWRlIHBvaW50IGxvY2F0aW9ucyBmb3IgYW55IGxhdGVyIGNsdXN0ZXJpbmcgb3IgaG90IHNwb3QgYW5hbHlzaXMuDQoNCmBgYHtyIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDZ9DQpwbG90LmNvbG9ycyA8LSBjKGl0ZWFtLmNvbG9yc1sxXSwgaXRlYW0uY29sb3JzWzRdLCBpdGVhbS5jb2xvcnNbNV0pDQoNCg0KcGFsIDwtIGNvbG9yRmFjdG9yKHBsb3QuY29sb3JzLA0KICAgICAgICAgICAgICAgICAgIGRvbWFpbiA9IGluY2VuJHByb2cudHlwZSkNCg0KaG9vZHMubGFiZWxzIDwtIHBhc3RlMCgNCiAgaG9vZHMkbGFiZWwsDQogICI8YnI+MjAxNyBIb3VzaW5nIE1hcmtldCBUeXBvbG9neTogIiwgaG9vZHMkcHJlZG9taW5hbnQuY29kZQ0KKQ0KDQpsYWJlbHMgPC0gcGFzdGUwKA0KICBpbmNlbiRwcm9nLnR5cGUsDQogICI8YnI+IiwgaW5jZW4kaG91c2UubnVtLCAiICIsIGluY2VuJHN0cmVldCwgIiAiLCBpbmNlbiRzdHJlZXQudHlwZSwNCiAgIjxicj5BbW91bnQ6ICQiLCBpbmNlbiRhbW91bnQNCiAgDQopDQoNCmxlYWZsZXQoKSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtNzYuNiwgbGF0ID0gMzkuMywgem9vbSA9IDExKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkU3RhbWVuLlRvbmVyTGl0ZSkgJT4lIA0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsDQogICAgICAgICAgICAgIHN0cm9rZSA9IFQsDQogICAgICAgICAgICAgIGZpbGwgPSBULA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsDQogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMywNCiAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KGhvb2RzLmxhYmVscywgSFRNTCksDQogICAgICAgICAgICAgIG9wYWNpdHkgPSAuNCkgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IGluY2VuICU+JSBmaWx0ZXIocHJvZy50eXBlID09ICJMTllXIiksDQogICAgICAgICAgICAgICAgICAgcmFkaXVzID0gMSwNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9IGl0ZWFtLmNvbG9yc1sxXSwNCiAgICAgICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkobGFiZWxzLCBIVE1MKSwNCiAgICAgICAgICAgICAgICAgICBncm91cCA9ICJMTllXIg0KICApICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGEgPSBpbmNlbiAlPiUgZmlsdGVyKHByb2cudHlwZSA9PSAiQ0RCRyIpLA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IDEsDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBpdGVhbS5jb2xvcnNbNF0sDQogICAgICAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KGxhYmVscywgSFRNTCksDQogICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAiQ0RCRyINCiAgKSAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycyhkYXRhID0gaW5jZW4gJT4lIGZpbHRlcihwcm9nLnR5cGUgPT0gIlYyViIpLA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IDEsDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBpdGVhbS5jb2xvcnNbM10sDQogICAgICAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KGxhYmVscywgSFRNTCksDQogICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAiVjJWIg0KICApICU+JQ0KICBhZGRMYXllcnNDb250cm9sKG92ZXJsYXlHcm91cHMgPSBjKCJMTllXIiwgIkNEQkciLCAiVjJWIiksDQogICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxheWVyc0NvbnRyb2xPcHRpb25zKGNvbGxhcHNlZCA9IEZBTFNFKSkNCg0KYGBgDQoNCiMjIyBGdW5kaW5nIGRpc3RyaWJ1dGlvbiBieSBITVQgZ3JvdXANCg0KVGhlIHN1bW1hcnkgdGFibGUgYmVsb3cgZ2l2ZXMgdGhlIHBlcmNlbnQgb2YgcHJvZ3JhbSBmdW5kaW5nIHRoYXQgd2FzIGRpc3RyaWJ1dGVkIHRvIGVhY2ggaG91c2luZyBtYXJrZXQgdHlwZS4gTGl2ZSBOZWFyIFlvdXIgV29yayBpcyB1dGlsaXplZCBwcmltYXJpbHkgaW4gc3Ryb25nL2hlYWxodHkgbWFya2V0cywgd2hpbGUgODUlIG9mIENEQkcgZnVuZGluZyBnb2VzIHRvIG1pZGRsZSBuZWlnaGJvcmhvb2RzLg0KDQoNCmBgYHtyIGVjaG8gPSBUfQ0KaW5jZW4gJT4lIA0KICBncm91cF9ieShwcm9nLnR5cGUsIGhtdC5ncm91cCkgJT4lDQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShhcy5udW1lcmljKGFtb3VudCkpKSAlPiUNCiAgbXV0YXRlKHRvdGFsID0gaWZlbHNlKGlzLm5hKHRvdGFsKSwgMCwgdG90YWwpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShwcm9nLnR5cGUpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBncm91cF9ieShwcm9nLnR5cGUpICU+JQ0KICBtdXRhdGUocGN0ID0gcGVyY2VudCh0b3RhbCAvIHN1bSh0b3RhbCkpKSAlPiUNCiAgc2VsZWN0KC10b3RhbCkgJT4lDQogIHNwcmVhZChrZXkgPSBwcm9nLnR5cGUsIHZhbHVlID0gcGN0KQ0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KIyBKdXN0aW4gdG8gYWRkIHJvbGwgdXAgb2YgZG9sbGFyIGFtb3VudHMNCg0KaG9vZHNAZGF0YSA8LSBob29kc0BkYXRhICU+JQ0KICBsZWZ0X2pvaW4oDQogICAgaW5jZW4gJT4lIA0KICAgICAgY291bnQobGFiZWwsIHByb2cudHlwZSkgJT4lIA0KICAgICAgc3ByZWFkKGtleSA9IHByb2cudHlwZSwgdmFsdWUgPSBuKSwNCiAgICBieSA9IGMoImxhYmVsIiA9ICJsYWJlbCIpDQogICkgJT4lDQogIGxlZnRfam9pbigNCiAgICBzYWxlcyAlPiUgDQogICAgICBmaWx0ZXIoZGVlZC5kYXRlID49ICIyMDE1LTA3LTAxIiwNCiAgICAgICAgICAgICBkZWVkLmRhdGUgPD0gIjIwMTgtMDYtMzAiKSAlPiUgDQogICAgICBjb3VudChuZWlnaGJvcmhvb2QpICU+JQ0KICAgICAgcmVuYW1lKHNhbGVzLjE2XzE4ID0gbiksDQogICAgYnkgPSBjKCJsYWJlbCIgPSAibmVpZ2hib3Job29kIikNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KaG9vZHNAZGF0YSA8LSBob29kc0BkYXRhICU+JQ0KICBtdXRhdGVfYXQoDQogICAgdmFycyhDREJHLCBMTllXLCBWMlYsIHNhbGVzLjE2XzE4KSwNCiAgICBmdW5zKHJlcGxhY2UoLiwgaXMubmEoLiksIDApKQ0KICApICU+JQ0KICBtdXRhdGUoDQogICAgbG55dy5wZXIuMTAwc2FsZXMgPSAxMDAgKiBMTllXIC8gc2FsZXMuMTZfMTgsDQogICAgY2RiZy5wZXIuMTAwc2FsZXMgPSAxMDAgKiBDREJHIC8gc2FsZXMuMTZfMTgsDQogICAgdjJ2LnBlci4xMDBzYWxlcyA9IDEwMCAqIFYyViAvIHNhbGVzLjE2XzE4DQogICkNCmBgYA0KDQpUaGUgbWFwIGFuZCB0YWJsZSBiZWxvdyBwcmVzZW50IGEgcHJvZ3JhbSAidXRpbGl6YXRpb24iIG1ldHJpYyAtIHRoZSBudW1iZXIgb2YgaW5jZW50aXZlcyB1c2VkIHBlciAxMDAgaG9tZSBzYWxlcy4NCg0KVGhlIHN1bW1hcnkgdGFibGUgYmVsb3cgZ2l2ZXMgcHJvZ3JhbSAidXRpbGl6YXRpb24iIGJ5IGhvdXNpbmcgbWFya2V0IHR5cG9sb2d5IHRpZXIuDQoNCmBgYHtyfQ0KaG9vZHNAZGF0YSAlPiUNCiAgbXV0YXRlX2htdF9ncm91cChwcmVkb21pbmFudC5jb2RlKSAlPiUNCiAgbXV0YXRlKGhtdC5ncm91cCA9IGZjdF9yZWxldmVsKGhtdC5ncm91cCwgaG10LmxldmVscykpICU+JQ0KICBncm91cF9ieShobXQuZ3JvdXApICU+JQ0KICBzdW1tYXJpc2UoDQogICAgc2FsZXMuMTZfMTggPSBzdW0oc2FsZXMuMTZfMTgpLA0KICAgIGxueXcuY291bnQgPSBzdW0oTE5ZVyksDQogICAgbG55dy5wZXIuMTAwc2FsZXMgPSAxMDAgKiBsbnl3LmNvdW50IC8gc3VtKHNhbGVzLjE2XzE4KSwNCiAgICBjZGJnLmNvdW50ID0gc3VtKENEQkcpLA0KICAgIGNkYmcucGVyLjEwMHNhbGVzID0gMTAwICogY2RiZy5jb3VudCAvIHN1bShzYWxlcy4xNl8xOCksDQogICAgdjJ2LmNvdW50ID0gc3VtKFYyViksDQogICAgdjJ2LnBlci4xMDBzYWxlcyA9IDEwMCAqIHYydi5jb3VudCAvIHN1bShzYWxlcy4xNl8xOCkpICU+JQ0KICBtdXRhdGVfYXQoDQogICAgdmFycyhsbnl3LnBlci4xMDBzYWxlcywgY2RiZy5wZXIuMTAwc2FsZXMsIHYydi5wZXIuMTAwc2FsZXMpLA0KICAgIGZ1bnMocm91bmQoLiwxKSkpDQpgYGANCg0KYGBge3Igb3V0LndpZHRoID0gIjEwMCUiLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gNn0NCiN2YXJuYW1lIDwtICJsbnl3LnBlci4xMDBzYWxlcyINCg0KICBiaW5zIDwtIGMoMCwgMC4xLCAwLjUsICAxLCA1LCAxMCwgNTAsIDEwMCkNCg0KICBwYWwgPC0gY29sb3JCaW4oIkJsdWVzIiwNCiAgICAgICAgICAgICAgICAgIGRvbWFpbiA9IGMoMCwgMTAwKSwNCiAgICAgICAgICAgICAgICAgIGJpbnMgPSBiaW5zKQ0KDQpsbnl3LmxhYmVscyA8LSBwYXN0ZTAoDQogIGhvb2RzJGxhYmVsLA0KICAiPGJyPjIwMTcgSG91c2luZyBNYXJrZXQgVHlwb2xvZ3k6ICIsIGhvb2RzJHByZWRvbWluYW50LmNvZGUsDQogICI8YnI+TE5ZVyBwZXIgMTAwIHNhbGVzOiAiLCBhcy5jaGFyYWN0ZXIocm91bmQoaG9vZHMkbG55dy5wZXIuMTAwc2FsZXMsIDEpKQ0KKQ0KDQpjZGJnLmxhYmVscyA8LSBwYXN0ZTAoDQogIGhvb2RzJGxhYmVsLA0KICAiPGJyPjIwMTcgSG91c2luZyBNYXJrZXQgVHlwb2xvZ3k6ICIsIGhvb2RzJHByZWRvbWluYW50LmNvZGUsDQogICI8YnI+Q0RCRyBwZXIgMTAwIHNhbGVzOiAiLCBhcy5jaGFyYWN0ZXIocm91bmQoaG9vZHMkY2RiZy5wZXIuMTAwc2FsZXMsIDEpKQ0KKQ0KDQp2MnYubGFiZWxzIDwtIHBhc3RlMCgNCiAgaG9vZHMkbGFiZWwsDQogICI8YnI+MjAxNyBIb3VzaW5nIE1hcmtldCBUeXBvbG9neTogIiwgaG9vZHMkcHJlZG9taW5hbnQuY29kZSwNCiAgIjxicj5WMlYgcGVyIDEwMCBzYWxlczogIiwgYXMuY2hhcmFjdGVyKHJvdW5kKGhvb2RzJHYydi5wZXIuMTAwc2FsZXMsIDEpKQ0KKQ0KDQpsZWFmbGV0KCkgJT4lDQogIHNldFZpZXcobG5nID0gLTc2LjYsIGxhdCA9IDM5LjMsIHpvb20gPSAxMSkgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJFN0YW1lbi5Ub25lckxpdGUpICU+JQ0KICAgIGFkZFBvbHlnb25zKGRhdGEgPSBob29kcywNCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLA0KICAgICAgICAgICAgICBmaWxsID0gVCwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwKSAlPiUNCiAgYWRkUG9seWdvbnMoZGF0YSA9IGhvb2RzLA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IC41LA0KICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsKGhvb2RzJGxueXcucGVyLjEwMHNhbGVzKSwNCiAgICAgICAgICAgICAgY29sb3IgPSAiZ3JheTEwIiwNCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwNCiAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KGxueXcubGFiZWxzLCBIVE1MKSwNCiAgICAgICAgICAgICAgZ3JvdXAgPSAiTE5ZVyIpICU+JQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjUsDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwoaG9vZHMkY2RiZy5wZXIuMTAwc2FsZXMpLA0KICAgICAgICAgICAgICBjb2xvciA9ICJncmF5MTAiLA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLA0KICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoY2RiZy5sYWJlbHMsIEhUTUwpLA0KICAgICAgICAgICAgICBncm91cCA9ICJDREJHIikgJT4lDQogIGFkZFBvbHlnb25zKGRhdGEgPSBob29kcywNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuNSwNCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbChob29kcyR2MnYucGVyLjEwMHNhbGVzKSwNCiAgICAgICAgICAgICAgY29sb3IgPSAiZ3JheTEwIiwNCiAgICAgICAgICAgICAgc3Ryb2tlID0gVCwNCiAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsDQogICAgICAgICAgICAgIHdlaWdodCA9IDIsDQogICAgICAgICAgICAgIGxhYmVsID0gfmxhcHBseSh2MnYubGFiZWxzLCBIVE1MKSwNCiAgICAgICAgICAgICAgZ3JvdXAgPSAiVjJWIikgJT4lDQogIGFkZExlZ2VuZChwYWwgPSBwYWwsIHZhbHVlcyA9IGJpbnMsIHRpdGxlID0gIkluY2VudGl2ZXMgcGVyIDEwMCBTYWxlcyIpICU+JQ0KICBhZGRMYXllcnNDb250cm9sKGJhc2VHcm91cHMgPSBjKCJMTllXIiwgIkNEQkciLCAiVjJWIiksDQogICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxheWVyc0NvbnRyb2xPcHRpb25zKGNvbGxhcHNlZCA9IEZBTFNFKSkNCg0KYGBgDQoNCg0KDQojIyMgUHJvZ3JhbSBkZW1vZ3JhcGhpY3MNCg0KYGBge3IgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDN9DQppbmNlbiAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX2RlbnNpdHkoYWVzKGhvdXNlaG9sZC5pbmNvbWUsIGNvbG9yID0gcHJvZy50eXBlKSkgKw0KICB0aGVtZV9pdGVhbV9wcmVzZW50YXRpb25zKCkgKw0KICB4bGltKGMoMCwgMzAwMDAwKSkNCmBgYA0KDQpgYGB7cn0NCmluY2VuICU+JQ0KICBmaWx0ZXIoaG91c2Vob2xkLmluY29tZSA8PSAyMDAwMDApICU+JQ0KICBnZ3Bsb3QoKSArDQogIGdlb21fYm94cGxvdChhZXMocHJvZy50eXBlLCBob3VzZWhvbGQuaW5jb21lKSkgKw0KICB0aGVtZV9pdGVhbV9nb29nbGVfZG9jcygpDQpgYGANCmBgYHtyfQ0KaW5jZW4gJT4lDQogIGdyb3VwX2J5KHByb2cudHlwZSkgJT4lDQogIHN1bW1hcmlzZShtZWRpYW4uaW5jb21lID0gbWVkaWFuKGhvdXNlaG9sZC5pbmNvbWUsIG5hLnJtID0gVCksDQogICAgICAgICAgICBtZWFuLmluY29tZSA9IG1lYW4oaG91c2Vob2xkLmluY29tZSwgbmEucm0gPSBUKSkNCmBgYA0KDQpgYGB7cn0NCmluY2VuICU+JQ0KICBjb3VudChwcm9nLnR5cGUsIHJhY2UpICU+JQ0KICBncm91cF9ieShwcm9nLnR5cGUpICU+JQ0KICBtdXRhdGUocGN0ID0gcGVyY2VudChuIC8gc3VtKG4pKSkgJT4lDQogIHNlbGVjdCgtbikgJT4lDQogIHNwcmVhZChrZXkgPSBwcm9nLnR5cGUsIHZhbHVlID0gcGN0KQ0KYGBgDQoNCiMgRWZmZWN0IG9mIFByb2dyYW1zDQoNCmBgYHtyfQ0KaW5jZW4uYW5hbHl0aWNzIDwtIGluY2VuICU+JQ0KICB0cmFuc211dGUobGFiZWwgPSBsYWJlbCwNCiAgICAgICAgICAgIGhtdC5ncm91cCA9IGhtdC5ncm91cCwNCiAgICAgICAgICAgIHByb2cudHlwZSA9IHByb2cudHlwZSwNCiAgICAgICAgICAgIHByaWNlLmluY29tZS5yYXRpbyA9IHNhbGVzLnByaWNlIC8gaG91c2Vob2xkLmluY29tZSwNCiAgICAgICAgICAgIGluY2VuLmluY29tZS5yYXRpbyA9IGFtb3VudCAvIGhvdXNlaG9sZC5pbmNvbWUsDQogICAgICAgICAgICBpbmNlbi5wcmljZS5yYXRpbyA9IGFtb3VudCAvIHNhbGVzLnByaWNlKQ0KICANCmBgYA0KDQoNCmBgYHtyfQ0KaW5jZW4uYW5hbHl0aWNzICU+JQ0KICBnZ3Bsb3QoYWVzKGluY2VuLnByaWNlLnJhdGlvKSkgKw0KICBnZW9tX2RlbnNpdHkoYWVzKGNvbG9yID0gcHJvZy50eXBlKSkgKw0KICB4bGltKGMoMCwgLjI1KSkNCmBgYA0KDQpgYGB7cn0NCmluY2VuLmFuYWx5dGljcyAlPiUgDQogIGdyb3VwX2J5KHByb2cudHlwZSkgJT4lDQogIHN1bW1hcmlzZShtZWRpYW4uaW5jZW4ucHJpY2UucmF0aW8gPSBtZWRpYW4oaW5jZW4ucHJpY2UucmF0aW8sIG5hLnJtID0gVCksDQogICAgICAgICAgICBtZWFuLmluY2VuLnByaWNlLnJhdGlvID0gbWVhbihpbmNlbi5wcmljZS5yYXRpbywgbmEucm0gPSBUKSkNCmBgYA0KDQpgYGB7cn0NCmluY2VuLmFuYWx5dGljcyAlPiUNCiAgZ3JvdXBfYnkoaG10Lmdyb3VwLCBwcm9nLnR5cGUpICU+JQ0KICBzdW1tYXJpc2UobWVkaWFuLmluY2VuLnByaWNlLnJhdGlvID0gcGVyY2VudChtZWRpYW4oaW5jZW4ucHJpY2UucmF0aW8sIG5hLnJtID0gVCkpKSAlPiUNCiAgc3ByZWFkKGtleSA9IHByb2cudHlwZSwgdmFsdWUgPSBtZWRpYW4uaW5jZW4ucHJpY2UucmF0aW8pDQpgYGANCg0KYGBge3J9DQojIGp1c3RpbiBzdGFydCBoZXJlIGFuZCBqb2luIHRoZSBpbmNlbnRpdmVzIHRvIHRoZSBzYWxlcw0Kc2FsZXMuaW5jZW4gPC0gc2FsZXMgJT4lDQogIGxlZnRfam9pbigNCiAgICBpbmNlbiwgDQogICAgYnkgPSBjKCkpDQpgYGANCg0KDQojIFdlYXRoZXJpemF0aW9uICsgUmVwYWlyDQoNCltuZWVkcyBnZW9jb2RlZF0NCg0K